package com.lmaos.basetools.base;

import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/** 
 * 
 * @author lmaos
 *
 * <p>作者：张星宇</p>
 * <p>时间：2017年6月16日 下午8:53:50</p>
 * <p>说明:对数组和list做操作		</p>
 *
 */
public class SArrayUtils {
	
	/**
	 * 说明：创建固定长度的数组		<br>
	 * 时间：2017年6月16日 上午8:36:51
	 *
	 * @param arrayType 数组类型 int[].class ，List.class
	 * @param length
	 * @return
	 */
	public static Object createArray(Class arrayType,int length){
		if(List.class.isAssignableFrom(arrayType)){
			List list = new ArrayList();
			for (int i = 0; i < length; i++) {
				list.add(0);
			}
			return list;
		}
		if(arrayType.isArray()){
			return Array.newInstance(arrayType.getComponentType(), length);
		}else{
			return Array.newInstance(arrayType, length);
		}
	}
	/**
	 * 说明：获得数组当前下标的数据		<br>
	 * 时间：2017年6月16日 下午8:52:34
	 *
	 * @param array
	 * @param index
	 * @return
	 */
	public static Object get(Object array,int index){
		if(array instanceof List){
			return ((List)array).get(index);
		}
		return Array.get(array, index);
	}
	/**
	 * 说明：设置数组当前下标的数据		<br>
	 * 时间：2017年6月16日 下午8:53:03
	 *
	 * @param array
	 * @param index
	 * @param value
	 */
	public static void set(Object array,int index,Object value){
		if(array instanceof List){
			List list = (List)array;
			int appendlength = index-list.size();
			if(appendlength>=0){
				for (int i = 0; i <= appendlength; i++) {
					list.add(0);
				}
			}
			list.set(index, value);
		}else{
			Array.set(array, index, value);
		}
	}
	/**
	 * 说明：是否是数组		<br>
	 * 时间：2017年6月16日 下午8:53:24
	 *
	 * @param array
	 * @return
	 */
	public static boolean isArrays(Object array){
		return array.getClass().isArray()||array instanceof List;
	}
	/**
	 * 说明：获得数组长度		<br>
	 * 时间：2017年6月16日 下午8:54:06
	 *
	 * @param array
	 * @return
	 */
	public static int getLength(Object array){
		if(array instanceof List){
			return ((List)array).size();
		}
		return Array.getLength(array);
	}
	public static void copy(Object srcArray,Object desArray){
		if(srcArray instanceof List){
			Collections.copy((List)desArray, (List)srcArray);
		}else{
			System.arraycopy(srcArray, 0, desArray, 0, getLength(desArray));
		}
	}
	
	
	public static void copy(Object srcArray,Object desArray,int pos,int length){
		if(srcArray instanceof List){
			Collections.copy((List)desArray, ((List)srcArray).subList(pos, pos+length));
		}else{
			System.arraycopy(srcArray, pos, desArray, 0, length);
		}
	}
	
	/**
	 * 说明：合并多个数组		<br>
	 * 时间：2017年6月26日 下午8:54:20
	 *
	 * @param arrays 数组对象
	 * @return
	 */
	public static Object merge(Object...arrays){
		int length = 0;
		for (Object array : arrays) {
			length += getLength(array);
		}
		Object array_n =  createArray(arrays[0].getClass(), length);
		int destPos = 0;
		for (Object array : arrays) {
			int arrlength = getLength(array);
			if(array instanceof List||array_n instanceof List){
				for (int i = 0; i < arrlength; i++,destPos++) {
					set(array_n, destPos, get(array, i));
				}
			}else{
				System.arraycopy(array, 0, array_n, destPos, arrlength);
				destPos = arrlength;
			}
		}
		return array_n;
	}
	public static void main(String[] args) {
//		System.out.println(List.class.isAssignableFrom(ArrayList.class));
//		List<Integer> a = (List<Integer>) createArray(List.class, 10);
//		set(a, 11, 10);
//		System.out.println(a);
//		System.out.println(getLength(a));
		
		int i[] = {1,2,3,4};
		List<Integer> j = (List<Integer>) createArray(List.class, 10);
		j.set(0, 2000);
		int k[] = (int[]) merge(i,j,(List<Integer>) createArray(List.class, 10));
		
		System.out.println(k[4]);
		
	}
}
